#!/usr/bin/env python
#_*_ coding: utf-8 *_*
'''
Created on 2 feb. 2010

@author:
http://snippets.dzone.com/posts/show/9661
'''
# A very simple python example to generate binaural beats. 
# The data is sent to the device in a too basic way, so the 
# script only works well with integer frecuencies. 

from alsaaudio import *
from struct import pack
from math import sin, pi

def bipe():
    # Channel 1
    frec1=200    #Frequency
    vol1=1        #Volume
    
    #Channel 2    
    frec2=323     #Frequency
    vol2=1        #Volume
    
    #Very basic choice of parameters
    rate = 44100
    period = 44100 / 4
    channels = 2
    
    # device initialization
    out = PCM(type=PCM_PLAYBACK, mode=PCM_NORMAL, card='default')
    
    # parameters
    out.setchannels(channels)
    out.setrate(rate)
    out.setformat(PCM_FORMAT_S32_LE)
    
    out.setperiodsize(period)
    
    # a list with the sinusoidal signals is built
    maxAmp = pow(2,31) - 1
    
    list = []
    i=period
    while(i>= 0):
        list.append(maxAmp*vol1*sin(frec1*float(i)/rate*2*pi))
        list.append(maxAmp*vol2*sin(frec2*float(i)/rate*2*pi))
        i-=1
    
    # and the list is writen over and over again. Just kill the process to stop.
    s=pack('<'+channels*period*'l',*list)
    while(1):
        out.write(s)
